/*************************************************
  * 描述：des对称加密解密
  *
  * File：desencrypt.h
  * Author：chenyujin@mozihealthcare.cn
  * Date：2025/9/9
  * Update：
  * ************************************************/
#ifndef COREXI_COMMON_PC_DESENCRYPT_H
#define COREXI_COMMON_PC_DESENCRYPT_H

#include <common/export.h>
#include <string>

#define KEY "{E4D9A10B-706C-476C-8D50-80BB5D45BF74}"

/* DES-CBC 加密/解密

算法：DES（Data Encryption Standard）
模式：CBC（Cipher Block Chaining）
填充：PKCS#7 填充
密钥长度：8 字节（64 bit，其中 56 bit 实际有效）
IV 长度：8 字节
库：Crypto++
特点：
	对称加密
	密钥和 IV 必须固定长度
*/

/* Base64 编码 + 前缀
算法：Base64 编码（严格来说不是加密算法）
附加操作：在编码结果前加 6 个随机大写字母
库：Crypto++ 的 Base64Encoder（C++17 重写版本）
特点：
	可逆（Base64 可以解码）
	前缀是随机的，解码前必须去掉前 6 个字符
	本质是编码，不是加密
*/

/* 生成 DES 密钥(实现细节已隐藏)
算法：MD5 哈希 → 取前 8 字节
用途：生成固定长度 DES 密钥
库：Crypto++
特点：
	MD5 哈希是单向函数
	输出固定长度 16 字节，取前 8 字节作为 DES 密钥
	保证任意字符串生成确定的 8 字节 DES 密钥
*/


class CXI_COMMON_EXPORT DESEncrypt
{
public:
	/**
	 * @brief 加密
	 * @param plaintext 原始串
	 * @return
	 */
	static std::string encrypt(const std::string& plaintext);

	/**
	 * @brief 解密
	 * @param ciphertext 加密串
	 * @return
	 */
	static std::string decrypt(const std::string& ciphertext);

	/**
	 * @brief 加密
	 * @param plaintext 原始串
	 * @param key 密钥
	 * @return
	 */
	static std::string encrypt(const std::string& plaintext, const std::string& key);

	/**
	 * @brief 解密
	 * @param ciphertext 加密串
	 * @param key 密钥
	 * @return
	 */
	static std::string decrypt(const std::string& ciphertext, const std::string& key);

	/**
	 * @brief base64加密
	 * @param plaintext 原始串
	 * @return
	 */
	static std::string base64Encrypt(const std::string& plaintext);
};

#endif//COREXI_COMMON_PC_DESENCRYPT_H
